﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using TumbaloSoft.Helpers;
using System.Collections;
using TumbaloSoft.Models;
using TumbaloSoft.Helpers.QueryObjects;

namespace TumbaloSoft.Controllers
{
    public class JuntaDePropietariosController : TumbaloController
    {
        //
        // GET: /JuntaDePropietarios/
        private static Object lockObject = new Object();

        public ActionResult Asignar(int? idEdificio,BusquedaPropietario propietarioBuscar,bool? error)
        {
            if (defaultAction != null) return defaultAction;

            int numActivos = 0;
            if (!idEdificio.HasValue) return HttpNotFound();
            List<Propietario> listaPropietarios = new List<Propietario>();
            try
            {
                List<Departamento> listaDepartamentos = new List<Departamento>(HelperDepartamento.selectByIdEdificio(idEdificio.Value).Cast<Departamento>());
                foreach (Departamento dept in listaDepartamentos)
                {
                    List<TituloDePropiedad> listaTitulos = HelperTituloDePropiedad.selectByIdInmueble(dept.prIdInmueble);
                    foreach (TituloDePropiedad titulo in listaTitulos)
                    {
                        propietarioBuscar.prIdPropietario = titulo.prPropietario.prIdPropietario;
                        Propietario prop = HelperPropietario.selectByBusquedaAndId(propietarioBuscar);
                        if (prop != null)
                        {
                            listaPropietarios.Add(prop);
                        }
                    }
                }
                ViewBag.listaActivos = HelperJuntaDePropietarios.selectActivosByIdEdificio(idEdificio.Value);
            }
            catch(Exception ex)
            {
                Logger.Current.Error("Error cargar los miembros de la junta", ex);
                return View("~/Views/Shared/Error.cshtml");
            }
            List<int> lista = new List<int>();
            foreach(Junta junta in ViewBag.listaActivos){
                lista.Add(junta.prPropietario.prIdPropietario);
            }
            ViewBag.lista = lista;
            ViewBag.prIdEdificio = idEdificio;
            ViewBag.listaPropietarios = listaPropietarios;
            ViewBag.prevPage = propietarioBuscar.prPage - 1;
            ViewBag.nextPage = propietarioBuscar.prPage + 1;
            ViewBag.numPages = numActivos / propietarioBuscar.prPageSize;
            if ((numActivos % propietarioBuscar.prPageSize) > 0) ViewBag.numPages++;
            if (error.HasValue && error.Value) ViewBag.MensajeError = "Los cargos deben ser diferentes";
            return View();
        }

        [HttpPost]
        public ActionResult Asignar(int idEdificio, List<int>listaSeleccionados,List<int> listaPresentes,List<String> listaCargos,BusquedaPropietario propietarioBuscar)
        {
            if (defaultAction != null) return defaultAction;

            bool error = false;
            string cargo;
            string car;

            for (int i = 0; i < listaCargos.Count; i++)
            {
                cargo = listaCargos[i];
                int num = 0;
                for (int j = 0; j < listaCargos.Count; j++)
                {
                    car = listaCargos[j];
                    if (car == cargo && 
                        listaSeleccionados.Contains(listaPresentes[i]) && 
                        listaSeleccionados.Contains(listaPresentes[j])) num++;
                }
                if (num > 1) error = true;
            }

            if (error) return Asignar(idEdificio, new BusquedaPropietario(), true);
            lock (lockObject)
            {
                for (int i = 0; i < listaPresentes.Count; i++)
                {
                    Junta junta = new Junta();
                    junta.prEdificio = new Edificio();
                    junta.prEdificio.prIdEdificio = idEdificio;
                    junta.prPropietario = new Propietario();
                    junta.prPropietario.prIdPropietario = listaPresentes[i];
                    Junta juntaExistente;
                    try
                    {
                        juntaExistente = HelperJuntaDePropietarios.siExiste(junta);
                    }
                    catch(Exception ex)
                    {
                        Logger.Current.Error("Error al obtener un miembro de la junta ", ex);
                        return View("~/Views/Shared/Error.cshtml");
                    }
                    if (juntaExistente == null && listaSeleccionados != null && listaSeleccionados.Contains(listaPresentes[i]))
                    {
                        juntaExistente = new Junta();
                        juntaExistente.prEdificio = new Edificio();
                        juntaExistente.prEdificio.prIdEdificio = idEdificio;
                        juntaExistente.prPropietario = new Propietario();
                        juntaExistente.prPropietario.prIdPropietario = listaPresentes[i];
                        juntaExistente.prCargo = listaCargos[i];
                        try
                        {
                            HelperJuntaDePropietarios.insert(juntaExistente);
                        }
                        catch(Exception ex)
                        {
                            Logger.Current.Error("Error al insertar un miembro de la junta", ex);
                            return View("~/Views/Shared/Error.cshtml");
                        }
                    }
                    else
                    {
                        if (juntaExistente != null && (listaSeleccionados == null || !listaSeleccionados.Contains(listaPresentes[i])))
                        {
                            if (juntaExistente.prEstado != "ELIMINADO")
                                try
                                {
                                    HelperJuntaDePropietarios.delete(juntaExistente);
                                }
                                catch(Exception ex)
                                {
                                    Logger.Current.Error("Error al eliminar un miembro de la junta", ex);
                                    return View("~/Views/Shared/Error.cshtml");
                                }
                        }
                        if (juntaExistente != null && listaSeleccionados != null && listaSeleccionados.Contains(listaPresentes[i]))
                        {
                            juntaExistente.prCargo = listaCargos[i];
                            juntaExistente.prEstado = "ACTIVO";
                            try
                            {
                                HelperJuntaDePropietarios.update(juntaExistente);
                            }
                            catch(Exception ex)
                            {
                                Logger.Current.Error("Error al modificar un miebro de la junta", ex);
                                return View("~/Views/Shared/Error.cshtml");
                            }
                        }

                    }
                }
            }
            ViewBag.mensaje = "Se asignaron los miembros de la junta con exito";
            ViewBag.returnURL = "/edificios/modificar?id=" + idEdificio;
            return View("~/Views/Shared/Exito.cshtml");
        }

    }
}
